﻿//ISlippageManager.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Algo.Slippage
{
	using StockSharp.BusinessEntities;

	/// <summary>
	/// Интерфейс для менеджера расчета проскальзывания.
	/// </summary>
	public interface ISlippageManager
	{
		/// <summary>
		/// Суммарное значение проскальзывания по всем заявкам, зарегистрированным через <see cref="Registering(StockSharp.BusinessEntities.Order)"/>
		/// или <see cref="Registering(StockSharp.BusinessEntities.Order,decimal)"/>.
		/// </summary>
		decimal Slippage { get; }

		/// <summary>
		/// Зарегистрировать заявку для начала мониторинга проскальзывания. Ожидаемая цена равна <see cref="Order.Price"/>.
		/// </summary>
		/// <param name="order">Заявка, на основе которой необходимо вычислять проскальзывание.</param>
		void Registering(Order order);

		/// <summary>
		/// Зарегистрировать заявку для начала мониторинга проскальзывания.
		/// </summary>
		/// <param name="order">Заявка, на основе которой необходимо вычислять проскальзывание.</param>
		/// <param name="estimatedPrice">Ожидаемая цена сделки.</param>
		void Registering(Order order, decimal estimatedPrice);

		/// <summary>
		/// Перерегистрировать заявку <paramref name="oldOrder"/> с новой ценой из <paramref name="newOrder"/>.
		/// </summary>
		/// <param name="oldOrder">Старая заявка, которая мониторится на учет проскальзывания.</param>
		/// <param name="newOrder">Новая заявка, которая содержит обновленную ожидаемую цену по сделкам.</param>
		void ReRegistering(Order oldOrder, Order newOrder);

		/// <summary>
		/// Удалить расчет проскальзывания для ранее зарегистрированной заявки в случае ее ошибки при регистрации.
		/// </summary>
		/// <param name="fail">Информация об ошибке.</param>
		void RegisterFailed(OrderFail fail);

		/// <summary>
		/// Добавить новую сделку для раcсчета проскальзывания.
		/// </summary>
		/// <param name="trade">Новая сделка.</param>
		/// <returns>Проскальзывание для сделки.</returns>
		decimal AddTrade(MyTrade trade);

		/// <summary>
		/// Получить текущее проскальзывание по заявке.
		/// Если заявка все еще активна, то возвращается проскальзывание,
		/// рассчитанное на основе частично исполненных сделок.
		/// </summary>
		/// <param name="order">Заявка, по которой необходимо получить проскальзывание.</param>
		/// <returns>Значение проскальзывания.</returns>
		decimal GetSlippage(Order order);

		/// <summary>
		/// Получить проскальзывание по сделке.
		/// В качестве ожидаемой цены берется цена первоначальной заявки, которая в результате
		/// изменений цены через перерегистрацию <see cref="ReRegistering"/> привела к сделке.
		/// </summary>
		/// <param name="trade">Сделка, для которой необходимо получить проскальзывание.</param>
		/// <returns>Значение проскальзывания.</returns>
		decimal GetSlippage(MyTrade trade);

		/// <summary>
		/// Получить для текущей заявки изначальную, с цены которой начался мониторинг проскальзывания.
		/// </summary>
		/// <param name="order">Текущая заявка.</param>
		/// <returns>Изначальная заявка.</returns>
		Order GetOriginalOrder(Order order);

		/// <summary>
		/// Получить ожидаемую цену сделки для заявки.
		/// </summary>
		/// <param name="order">Заявка, для которой необходимо получить ожидаемую цену сделки для заявки.</param>
		/// <returns>Ожидаемая цена сделки.</returns>
		decimal GetEstimatedPrice(Order order);

		/// <summary>
		/// Обнулить <see cref="Slippage"/>.
		/// </summary>
		void Reset();
	}
}